#include"UdpServer.hpp"
#include<memory>
#include<cstdio>
extern Log lg;
void Usage(string proc)
{
    cout<<"\n\rUsage:"<<proc<<"port[1024+]\n"<<endl;
}

//服务器对信息增加前缀处理后输出
string Handler(const string &str)
{
    string res="Server get a msg:";
    res+=str;
    cout<<res<<endl;
    return res;
}

//可以让服务器执行客户端发过来的命令
string ExcuteCommand(const string &cmd)
{
    //SafeCheck（）
    FILE* fp=popen(cmd.c_str(),"r");//使用 popen 函数执行传入的命令 cmd 并打开一个管道以读取命令的标准输出。"r" 参数表示以只读模式打开管道。
    if(nullptr==fp)//命令的输出信息都在管道中，所以可以读取命令输出信息
    {
        perror("popen");
        return "error";
    }
    string ret;
    char buffer[4096];
    while(true)
    {
        char*ok=fgets(buffer,sizeof(buffer),fp);//反复从管道中读取一行数据到buffer中
        if(ok==nullptr)
        {
            break;
        }
        ret+=buffer;//把所有的命令输出结果都保存在ret里
    }
    
    //使用popen打开的管道要由pclose关闭
    pclose(fp);
    return ret;
}   

//要求运行服务器的时候要在命令行参数指定端口port
int main(int argc,char *argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        exit(0);
    }
    lg.Enable(2);
    uint16_t port=stoi(argv[1]);
    unique_ptr<UdpServer>svr(new UdpServer(port));//创建一个服务器对象
    //初始化并启动：
    svr->Init();
    svr->Run(Handler);//要传递一个让服务器执行的函数

    return 0;
}
